iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0

上一篇文章分享了Neo4j大量匯入CSV的方法,今天想跟大家介紹匯入 API 的方式;這裡所說的 API 是指 Restful API,格式為 JSON,至於其他格式的 API 例如 XML,就請自行研究囉,我對它毫無興趣 XD;CSV 的話,就參考匯入 CSV 檔案即可。

APOC Library

APOC 全名是 Awesome Procedures on Cypher,是 Neo4j 的實驗室專案之一,集合了大約 400 個常用的預存程序或函數,如果您想自行開發預存程序或函數,記得先來這裡(Overview of APOC functions and procedures)找找,別重複造輪子唷!

第一次使用 APOC Library 時,是需要先安裝的,否則會遇到類似的錯誤訊息:

There is no procedure with the name apoc.load.jsonParams registered for this database instance. Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed.

Install APOC Library

安裝 APOC 有兩種選擇,您可以安裝在 Project 層級,那麼該 Project 內所有資料庫都可以使用 APOC

Neo4j Install APOC for Projects

或是只安裝給特定的資料庫

Neo4j Install APOC for DB

Call JSON API by APOC

接下來就是重頭戲了,這次我們需要的是 apoc.load.jsonapoc.load.jsonParams 兩個程序

Call JSON API with HTTP GET

以預設的 HTTP GET 方式打台灣斷層資料 API

WITH 'https://www.geologycloud.tw/data/zh-tw/ActiveFault' AS uri
CALL apoc.load.json(uri)
YIELD value
RETURN value

不過 apoc.load.json 可以設定的參數有限,如果您需要設定 HTTP Header 或 Post body,請改用 apoc.load.jsonParams,後者預設至少給三個參數如下

WITH 'https://www.geologycloud.tw/data/zh-tw/ActiveFault' AS uri
CALL apoc.load.jsonParams(uri, null, null)
YIELD value
RETURN value

Call JSON API with custom headers and body by APOC

很多情況下 API 會要求特定的 Header,設定方式如下,特別注意 Header name 有特殊字元時的標記方式。

WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
    `X-Device-ID`: '263b651364d32caa6d'
}, null)
YIELD value
RETURN value

API 也常會要求認證以及 Content-Type

WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
    `Content-Type`:'application/json',
    `X-Device-ID`: '263b651364d32caa6d',
    Authorization: '9643799475551d6bd710698'
}, null)
YIELD value
RETURN value

用 POST 打 API 並設定 POST body

WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
    `Content-Type`:'application/json',
    `X-Device-ID`: '263b651364d32caa6d',
    Authorization: '9643799475551d6bd710698'
}, '{ "item_ids": [103507] }', '', { METHOD: 'POST' })
YIELD value
RETURN value

直接存取回傳的 JSON 資料中特定欄位

WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
    `Content-Type`:'application/json',
    `X-Device-ID`: '263b651364d32caa6d',
    Authorization: '9643799475551d6bd710698'
}, '{ "item_ids": [103507] }', '', { METHOD: 'POST' })
YIELD value
RETURN value['data']['items']

RETURN 的部分也可以寫成

RETURN value.data.items

或是直接在 apoc 程序的參數中設定要讀取的欄位

WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
    `Content-Type`:'application/json',
    `X-Device-ID`: '263b651364d32caa6d',
    Authorization: '9643799475551d6bd710698'
}, '{ "item_ids": [103507] }', 'data.items', { METHOD: 'POST' })
YIELD value
RETURN value

如果要讀取陣列中特定的一筆,也可以用類似 data.items[1] 的寫法。

Import JSON API

最後就是實際將 API 資料匯入資料庫的部分

WITH 'https://www.someyourapi.com/data' AS uri
CALL apoc.load.jsonParams(uri, {
    `Content-Type`:'application/json',
    `X-Device-ID`: '263b651364d32caa6d',
    Authorization: '9643799475551d6bd710698'
}, '{ "item_ids": [103507] }', 'data.items', { METHOD: 'POST' })
YIELD item
CREATE (n:License {name: item.license})
RETURN *

以上就是比較常用的匯入 API 方式,更多的細節,我可能之後會原文編輯補充喔。


上一篇
Neo4j 大量匯入 CSV 資料
下一篇
Neo4j 匯入 RDBMS 資料
系列文
看圖說故事,讓 Neo4j 重新詮釋你的資料庫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言